package model

import (
	"encoding/json"
	"fmt"
	"github.com/garyburd/redigo/redis"
	"go_example/src/chatroom/common/message"
	_ "net"
)

//服务启动后，初始化一个userDao的实例，在需要与redis交互时可直接使用
var MyUserDao *UserDao

//定义UserDao结构体，处理对用户的各种操作
type UserDao struct {
	pool *redis.Pool
}

//工程模式
func NewUserDao(pool *redis.Pool) (userDao *UserDao) {
	userDao = &UserDao{pool: pool}
	return
}

//关联方法，根据用户id，返回一个User实例+err
func (this *UserDao) GetUserById(conn redis.Conn, id int) (user *User, err error) {
	//通过指定id到redis查询这个用户
	res, err := redis.String(conn.Do("HGet","users",id))
	if err != nil {
		if err == redis.ErrNil { //表示在users哈希中没有找到对应id
			err = ErrorUserNotExists
		}
		return
	}
	//user = &User{}
	//把res反序列化成一个user实例
	err = json.Unmarshal([]byte(res), &user)
	if err != nil {
		fmt.Println("GetUserById() &user json.Unmarshal err=", err)
		return
	}
	return
}

//注册的校验
func (this *UserDao) Register(user *message.User) (err error) {
	//先从连接池中取出连接
	conn := this.pool.Get()
	defer conn.Close()

	_, err = this.GetUserById(conn, user.UserId)
	if err == nil {
		err = ErrorUserExists
		return
	}
	//说明该id在不在redis里，则可可以完成注册,将user序列化
	data, err := json.Marshal(user)
	if err != nil {
		return
	}
	_, err = conn.Do("HSet","users",user.UserId, string(data))
	if err != nil {
		fmt.Println("保存注册用户数据错误 err=", err)
		return
	}
	return
}

//登陆的校验
func (this *UserDao) Login(UserId int, UserPwd string) (user *User, err error) {
	//先从连接池中取出连接
	conn := this.pool.Get()
	defer conn.Close()
	user, err = this.GetUserById(conn, UserId)
	if err != nil {
		return
	}
	if user.UserPwd != UserPwd {
		err = ErrorUserPwd
		return
	}
	return
}


